<?php
if ( !defined ( "RUTA_FISICA_SISTEMA" ) )
   {
      require_once '../../../../config/Constantes.php';
   }

$ruta_sistema = RUTA_FISICA_SISTEMA . "/sistema/";

require_once $ruta_sistema . "general/clases/comun/ConfiguracionGeneral.php";
require_once $ruta_sistema . "general/clases/comun/archivos/OperacionArchivo.php";
require_once $ruta_sistema . "general/clases/comun/GeneralORM.php";


/**
 * 
 * Autor				: 	Juan Jose Muñiz Juarez
 * Fecha de Creacion	: 	29/04/2012,  17:30:57
 * Version 				: 	1.0
 * Descripcion 			:
 */
class GeneracionClases
   {
      private $_prefijo_clase;
      private $_indentacion;

      /**
       *
       * Nombre         	: 	__construct
       * Descripcion   	:
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	29/04/2012, 03:39:30
       */
      public function __construct( $prefijo = "" )
         {
            if ( $prefijo )
               {
                  $this -> _prefijo_clase = $prefijo;
               }
            else
               {
                  $this -> _prefijo_clase = "";
               }
               
            $this -> _indentacion = "       ";
         }

      /**
       * 
       * Nombre         : 	generarClase
       * Descripcion   	:	
       * Version 		:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora	:	29/04/2012, 03:40:00
       * @param  $nombre_clase
       * @param  $ubicacion
       * @param  $ubicacion_objeto
       * @param  $objeto
       * @param  $campo_id
       * @param  $autoincrement
       * @param  $etiqueta_fin
       * @return string
       */
      public function generarClase( $nombre_clase, $ubicacion, $ubicacion_objeto = null, $objeto = null, $campo_id = null, $autoincrement = null, $etiqueta_fin = false )
         {
            $contenido = "<?php ";
            $contenido .= PHP_EOL;

            $contenido .= " //      CLASE GENERADA AUTOMATICAMENTE " . PHP_EOL;
            $tabla = $nombre_clase;
            $nombre_clase =  GeneralORM::generarNombreClase( $nombre_clase );

            if ( ConfiguracionGeneral::get( "ORM_GENERAR_COMENTARIOS_CLASE" ) == "1" )
               {
                  $contenido .= $this -> generarComentario ( $nombre_clase, null, null, $tabla );                     
               }

            $contenido .= PHP_EOL;
            $contenido .= $this -> generarImportORM( $ubicacion_objeto );  
            $contenido .= PHP_EOL;
            
            $contenido .= PHP_EOL;
            $contenido .= "class " . $nombre_clase;
            $contenido .= PHP_EOL;
            $contenido .= "   { ";
            
            $contenido .= PHP_EOL;
            $contenido .= $this -> generarVariableORM(); 
            $contenido .= PHP_EOL;
            
            $contenido .= $this -> getContructor ( $objeto );
            $contenido .= PHP_EOL;
            $contenido .= $this -> generarMetodoCampoId( $campo_id );
            $contenido .= PHP_EOL;
            $contenido .= $this -> generarMetodoAutoincrement( $autoincrement );
            $contenido .= PHP_EOL;
           // $contenido .= $this -> getContructor ( $objeto );
           // $contenido .= PHP_EOL;
            $contenido .= $this -> generarMetodoORM();
            $contenido .= PHP_EOL;
            
            $contenido .= $this -> generarInformacionMetodos();
           // $contenido .= PHP_EOL;
            $contenido .= "   }";

            if ( $etiqueta_fin )
               {
                  $contenido .= "?>";
               }
               
            //var_dump( $contenido );   

            if ( $ubicacion )
               {
                  $directorio = $ubicacion . "/" ;
                 
                 $clase = $nombre_clase . ".php";
                 
                 OperacionArchivo::guardarContenido( $contenido, $directorio, $clase );      
               }
            else
               {
                  return $contenido;
               }
         }

     
      /**
       *
       * Nombre         	: 	getContructor
       * Descripcion   	:
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	29/04/2012, 03:37:58
       * @return string
       */
      private function getContructor( $objeto )
         {
            $constructor = "";

            if ( ConfiguracionGeneral::get( "ORM_GENERAR_COMENTARIOS_CONSTRUCTOR" ) == "1" )
               {
                  $constructor = $this -> generarComentario ( "__construct" );
               }
              

            $constructor .= $this -> _indentacion . "public function __construct( \$objeto )" . PHP_EOL;
            $constructor .= $this -> _indentacion . "  { " . PHP_EOL;
            $constructor .= $this -> _indentacion . "     if ( !\$objeto instanceof $objeto )  " . PHP_EOL;
            $constructor .= $this -> _indentacion . "      { " . PHP_EOL;
            $constructor .= $this -> _indentacion . "        throw new Exception( 'Solo se admiten objetos del tipo $objeto' );" . PHP_EOL;
            $constructor .= $this -> _indentacion . "      } " . PHP_EOL . PHP_EOL;
            $constructor .= $this -> _indentacion . "     \$this -> _objeto = \$objeto; " . PHP_EOL;
            $constructor .= $this -> _indentacion . "  }";

            return $constructor;
         }

     

      /**
       *
       * Nombre         	: 	generarComentario
       * Descripcion   	:
       * Version 	    :  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora	:	29/04/2012, 16:44:48
       * @param unknown_type $nombre
       * @param unknown_type $params
       * @param unknown_type $returns
       */
      private function generarComentario($nombre, $params = array ( ), $returns = array ( ), $tabla = "")
         {
            $documentacion = $this -> _indentacion . " /** " . PHP_EOL 
                           . $this -> _indentacion . "  * " . PHP_EOL 
                           . $this -> _indentacion . "  * Nombre       : 	$nombre  " . PHP_EOL 
                           . $this -> _indentacion . "  * Descripción  :	 " . PHP_EOL 
                           . $this -> _indentacion . "  * Version 		:  	1.0 " . PHP_EOL
                           . $this -> _indentacion . "  * Autor:		:	Juan Jose Muñiz Juarez " . PHP_EOL 
                           . $this -> _indentacion . "  * Fecha y Hora	:   " . date ( "d/m/Y h:i:s" ) . PHP_EOL;
           
            if ( $params )
               {
                  if ( is_array ( $params ) && count ( $params ) > 0 )
                     {
                        foreach ( $params as $param )
                           {
                              $documentacion .= $this -> _indentacion . "  * @param   	:   $param " . PHP_EOL;
                           }
                     }
                  else
                     {
                        $documentacion .= $this -> _indentacion . "  * @param   	:   $params " . PHP_EOL;
                     }
               }

            if ( $returns )
               {
                  if ( is_array ( $returns ) && count ( $returns ) > 0 )
                     {
                        foreach ( $returns as $return )
                           {
                              $documentacion .= $this -> _indentacion . "  * @return  	:   $return " . PHP_EOL;
                           }
                     }
                  else
                     {
                        $documentacion .= $this -> _indentacion . "  * @return   	:   $returns " . PHP_EOL;
                     }
               }

            $documentacion .= $this -> _indentacion . "  */" . PHP_EOL;
            return $documentacion;
         }
         
         /**
          * 
          * Nombre         	: 	generarInformacionMetodos
          * Descripcion   	:	
          * Version 			:  	1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora		:	03/05/2012, 16:09:53
          * params: 
          * return: return_type
          */
      private function generarInformacionMetodos()
        {
           $metodos = "";
           
           if ( $this -> _metodos )
             {
               foreach( $this -> _metodos as $metodo )
                 {
                    $metodos .= $metodo . PHP_EOL; 
                 }
             }
             
           return $metodos;  
        }   

        /**
         * 
         * Nombre         	: 	generarImportORM
         * Descripcion   	:	
         * Version 			:  	1.0
         * Autor:			:	Juan Jose Muñiz Juarez
         * Fecha y Hora		:	03/05/2012, 16:41:18
         * params: 
         * return: return_type
         */
      private function generarImportORM( $objeto = null )
        {
           $import = "  if ( !defined( \"RUTA_FISICA_SISTEMA\" ) )  " . PHP_EOL 
                   . "     {  " . PHP_EOL 
                   . "         require_once '../../../Constantes.php';" . PHP_EOL 
                   . "     } ";
           
           $import .= PHP_EOL;
           $import .= ' $ruta_sistema = RUTA_FISICA_SISTEMA . "/sistema/";';
           
           if ( $objeto )
             {
                $import .= PHP_EOL;
                
                if ( strpos( $objeto, ":" ) === false )
                  {
                     $import .= ' require_once $ruta_sistema . "' . str_replace( " ", "", $objeto )  . '";';
                  }
                else
                  {
                     $import .= ' require_once "' . str_replace( " ", "", $objeto ) . '";';
                  }
                    
                $import .= PHP_EOL;
             }
           
           return $import;
        }  
        
        /**
         * 
         * Nombre         	: 	generarMetodoORM
         * Descripcion   	:	
         * Version 			:  	1.0
         * Autor:			:	Juan Jose Muñiz Juarez
         * Fecha y Hora		:	03/05/2012, 20:09:34
         */
      private function generarMetodoORM()
        {
           $metodo = $this -> generarComentario( "getORM" );
           $metodo .= PHP_EOL;
           $metodo .= $this -> _indentacion . "public function getORM() " . PHP_EOL
                   .  $this -> _indentacion . "  { " . PHP_EOL
                   .  $this -> _indentacion . "    if ( !\$this -> _orm  )  " . PHP_EOL
                   .  $this -> _indentacion . "      { " . PHP_EOL
                   .  $this -> _indentacion . "         \$this -> _orm = new ORM( \$this -> _objeto ); " . PHP_EOL
                 //  .  $this -> _indentacion . "         \$this -> _orm -> setCampo_id( '\$this -> _campo_id' );  " . PHP_EOL
                  // .  $this -> _indentacion . "         \$this -> _orm -> setAutoincrement( '$this -> _autoincrement' ); " . PHP_EOL
                   .  $this -> _indentacion . "      } " . PHP_EOL             
                   .  $this -> _indentacion . " } " . PHP_EOL;
           
           return $metodo;
        }  
        
        /**
         * 
         * Nombre         	: 	generarVariableORM
         * Descripcion   	:	
         * Version 			:  	1.0
         * Autor:			:	Juan Jose Muñiz Juarez
         * Fecha y Hora		:	03/05/2012, 23:11:12
         * @return string
         */
      private function generarVariableORM()
        {
           $variable = $this -> _indentacion . " private \$_orm;";
           $variable .= PHP_EOL;
           $variable .= $this -> _indentacion . " private \$_objeto;";
           $variable .= PHP_EOL;
           $variable .= $this -> _indentacion . " private \$_campo_id;";
           $variable .= PHP_EOL;
           $variable .= $this -> _indentacion . " private \$_autoincrement;";
           
           return $variable;
        }  

        /**
         * 
         * Nombre         	: 	generarMetodoCampoId
         * Descripcion   	:	
         * Version 			:  	1.0
         * Autor:			:	Juan Jose Muñiz Juarez
         * Fecha y Hora		:	06/05/2012, 20:00:21
         * @param unknown_type $campo_id
         */
      private function generarMetodoCampoId( $campo_id )
        {
           if ( $campo_id )
             {
                $informacion = $this -> _indentacion . " public function setCampo_id( \$campo_id )" . PHP_EOL;
                $informacion .= $this -> _indentacion . "   { " . PHP_EOL;
                $informacion .= $this -> _indentacion . "      \$this -> _campo_id = \$campo_id; " . PHP_EOL;
                $informacion .= $this -> _indentacion . "   } ";
                
                return $informacion;
             }
             
           return "";  
        }  
        
        /**
         * 
         * Nombre         	: 	generarMetodoAutoincrement
         * Descripcion   	:	
         * Version 			:  	1.0
         * Autor:			:	Juan Jose Muñiz Juarez
         * Fecha y Hora		:	06/05/2012, 20:01:10
         * @param unknown_type $autoincrement
         */
      private function generarMetodoAutoincrement( $autoincrement)
        {
           if ( $autoincrement )
             {
               $informacion = $this -> _indentacion . " public function setAutoincrement( \$autoincrement )" . PHP_EOL;
               $informacion .= $this -> _indentacion . "   { " . PHP_EOL;
               $informacion .= $this -> _indentacion . "      \$this -> _autoincrement = \$autoincrement; " . PHP_EOL;
               $informacion .= $this -> _indentacion . "   } ";
              
               return $informacion;
             }
           
           return "";
        }  
        
      /**
       *
       * Nombre         	: 	generarGet
       * Descripcion   	:
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	29/04/2012, 03:39:21
       * @param unknown_type $metodo
       * @param unknown_type $acceso
       */
      private function generarMetodo( $metodo, $acceso = "public", $valor_default = "", $parametro = "" )
         {
            if ( $metodo )
               {
                  $codigo = "";

                  if ( ConfiguracionGeneral::get( "ORM_GENERAR_COMENTARIOS_GET" ) == "1" )
                     {
                        $codigo = $this -> generarComentario ( $metodo, $metodo );                           
                     }

                  $codigo .= $this -> _indentacion . $acceso . " function " . ( $metodo ) . "( $parametro ) " . PHP_EOL 
                          . $this -> _indentacion . "  { " . PHP_EOL 
                          . $this -> _indentacion . "     \$this -> getORM(); " . PHP_EOL
                          . $this -> _indentacion . "     \$this -> _orm -> $valor_default;" . PHP_EOL 
                          . $this -> _indentacion . "  } " . PHP_EOL;

                  $this -> _metodos [ ] = $codigo;
               }
         }
         
         /**
          * 
          * Nombre         	: 	generarMetodoSave
          * Descripcion   	:	
          * Version 			:  	1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora		:	03/05/2012, 15:57:45
          * params: @param unknown_type $metodo
          * params: @param unknown_type $acceso
          * return: return_type
          */
      public function generarMetodoSave( $acceso = "public" )
        {
           $this -> generarMetodo( "save", $acceso, "save( \$campos_ignorar )" , "\$campos_ignorar = null");
        } 

        /**
         * 
         * Nombre         	: 	generarMetodoUpdate
         * Descripcion   	:	
         * Version 			:  	1.0
         * Autor:			:	Juan Jose Muñiz Juarez
         * Fecha y Hora		:	03/05/2012, 15:59:59
         * params: @param unknown_type $metodo
         * params: @param unknown_type $acceso
         * return: return_type
         */
      public function generarMetodoUpdate( $acceso = "public" )
        {
           $this -> generarMetodo( "update", $acceso, "update( \$campos_ignorar )", "\$campos_ignorar = null" );
        }  

        /**
         * 
         * Nombre         	: 	generarMetodoDelete
         * Descripcion   	:	
         * Version 			:  	1.0
         * Autor:			:	Juan Jose Muñiz Juarez
         * Fecha y Hora		:	03/05/2012, 16:00:03
         * params: @param unknown_type $metodo
         * params: @param unknown_type $acceso
         * return: return_type
         */
      public function generarMetodoDelete( $acceso = "public" )
        {
           $this -> generarMetodo( "delete", $acceso, "delete( \$filtro )", "\$filtro = null" );
        }  

        /**
         * 
         * Nombre         	: 	generarMetodoload
         * Descripcion   	:	
         * Version 			:  	1.0
         * Autor:			:	Juan Jose Muñiz Juarez
         * Fecha y Hora		:	03/05/2012, 16:00:06
         * params: @param unknown_type $metodo
         * params: @param unknown_type $acceso
         * return: return_type
         */
      public function generarMetodoLoad( $acceso = "public" )
        {
           $this -> generarMetodo( "load", $acceso, "load( \$id )", "\$id" );
        }
        
        /**
         * 
         * Nombre         	: 	generarMetodoFind
         * Descripcion   	:	
         * Version 			:  	1.0
         * Autor:			:	Juan Jose Muñiz Juarez
         * Fecha y Hora		:	03/05/2012, 16:00:10
         * params: @param unknown_type $metodo
         * params: @param unknown_type $acceso
         * return: return_type
         */
      public function generarMetodoFind( $acceso = "public" )
        {
           $this -> generarMetodo( "find", $acceso, "find( \$id, \$filtro )", "\$id = null, \$filtro = null" );
        } 
        
         /**
          * 
          * Nombre         : 	generarMetodoFindById
          * Descripcion   	:	
          * Version 			:  	1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora		:	03/05/2012, 16:00:15
          * params: @param unknown_type $metodo
          * params: @param unknown_type $acceso
          * return: return_type
          */
      public function generarMetodoFindById( $acceso = "public" )
        {
           $this -> generarMetodo( "findById", $acceso, "findById( \$id )", "\$id" );
        } 

      public function generarMetodoFindAll( $acceso = "public" )
        {
           $this -> generarMetodo( "findAll", $acceso, "findAll( \$filtro = null )", "\$filtro" );
        }  
   }

/*$gen = new GeneracionClases ( );

$gen -> generarMetodoSave();
$gen -> generarMetodoUpdate();
$gen -> generarMetodoFind();
$gen -> generarMetodoDelete();
$gen -> generarMetodoLoad();
$gen -> generarMetodoFindById();
$gen -> generarMetodoFindAll();
$gen -> generarClase ( "usuario", $ruta_sistema );*/
